﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Entidades;
using TCC_Hotel.Serviços.OtherServices;

namespace TCC_Hotel.Apresentacao.Produtos
{
    public partial class EditarProduto : System.Web.UI.Page
    {
        ProdutoService servico = new ProdutoService();
        FornecedorService servico_fornecedor = new FornecedorService();

        /// <summary>
        /// carregamento da página 
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Cadastrar_Produtos)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            if (!IsPostBack)
            {
                //limpa o chache existente para pegar os dados mais atualizados
                HttpContext.Current.Cache.Remove("Lista_Fornecedores");

                //Recupera o parametro da URL
                int ID = Convert.ToInt32(Request.Params["id"]);

                ProdutoService servico = new ProdutoService();

                //chama o serviço que busca no banco de dados o funcionario correspondente
                Produto produto = servico.RecuperarDetalhesProduto(ID);

                //Carrega os fornecedores cadastrados
                List<Fornecedor> fornecedores = servico_fornecedor.ListarFornecedoresCache();

                //popular o dropdown estados
                ddlFornecedores.DataSource = fornecedores.OrderBy(i => i.NomeFornecedor); 
                ddlFornecedores.DataTextField = "NomeFornecedor";
                ddlFornecedores.DataValueField = "ID";
                ddlFornecedores.DataBind();

                

                Fornecedor fornecedor_atual = fornecedores.Where(i => i.ID == produto.IDFornecedor).FirstOrDefault();
                if (produto != null)
                {
                    txtNomeProduto.Text = produto.NomeProduto;
                    txtQntMinima.Text = Convert.ToString(produto.QuantidadeMinima);
                    txtTelefone.Text = fornecedor_atual.TelefoneFornecedor;
                    txtEmailFornecedor.Text = fornecedor_atual.EmailFornecedor;
                    ckbPermitirEmail.Checked = produto.PermitirEnvioEmail;
                    ddlFornecedores.SelectedValue = Convert.ToString(fornecedor_atual.ID);
                    txtPrecoVenda.Text = string.Format("{0:0.00}", produto.PrecoVenda);
                    txtPedido.Text = Convert.ToString(produto.QuantidadePedido);
                   
                }


                //Se tiver checado, fornece as outras funcionalidades ao usuario
                if (ckbPermitirEmail.Checked == true)
                {
                    txtPedido.Enabled = true;
                    lblValidacaoPedido.Visible = true;  
                }
                else
                {
                    txtPedido.Enabled = false;
                    lblValidacaoPedido.Visible = false;
                }
            }
        }


        /// <summary>
        /// Tenta salvar o produto no banco de dados
        /// </summary>
        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            //Se nao vier parametro, redireciona o usuario para a tela inicial
            if (Request.Params["id"] == null)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            //Recupera o parametro da URL
            int ID = Convert.ToInt32(Request.Params["id"]);

            ComumServices comum = new ComumServices();

            //preenche a lista obrigatoria para verificar se todos os campos obrigatorios foram preenchidos
            List<string> listaObrigatoria = new List<string>() 
            { 
                txtNomeProduto.Text.Trim(),
                txtQntMinima.Text,                 
                txtPrecoVenda.Text
            
            };

            //se o permitir email estiver setado deve-se colocaa o pedido na lista obrigatoria
            if (ckbPermitirEmail.Checked == true)
            {
                listaObrigatoria.Add(txtPedido.Text);
                listaObrigatoria.Add(txtEmailFornecedor.Text);
            }
            else
            {
                //para não dar excessao na hora de converter para int
                txtPedido.Text = "0";
            }

            //verifica se algum campo obrigatorio nao foi preenchido
            if (!comum.ValidaCamposObrigatorios(listaObrigatoria))
            {
                MensagemJS("ERRO: Campo(s) obrigatório(s) em branco");
                return;
            }

            //monta o objeto produto
            try
            {
                Produto produto = new Produto()
                {
                    NomeProduto = txtNomeProduto.Text.Trim(),
                    QuantidadeMinima = Convert.ToInt32(txtQntMinima.Text),
                    IDFornecedor = Convert.ToInt32(ddlFornecedores.SelectedValue),                    
                    PermitirEnvioEmail = ckbPermitirEmail.Checked,
                    QuantidadePedido = Convert.ToInt32(txtPedido.Text),
                    PrecoVenda = Convert.ToDouble(txtPrecoVenda.Text)

                };



                //chama o serviço que insere o produto no banco de dados
                if (servico.EditarProduto(ID, produto))
                {
                    MensagemJS("Produto editado com sucesso!");
                    HttpContext.Current.Cache.Remove("Lista_Produtos");
                }
                else
                {
                    MensagemJS("ERRO: Erro na edição");
                    return;
                }

            }
            catch (Exception)
            {
                //se ocorrer exceção lanca mensagem para o usuário
                MensagemJS("ERRO: Campo(s) com valor(es) inválido(s)");
                return;

            }

        }

        /// <summary>
        /// Limpa todos os campos
        /// </summary>
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtNomeProduto.Text = null;
            txtQntMinima.Text = null;
            txtPedido.Text = null;
            txtPrecoVenda.Text = null;
        }

        /// <summary>
        /// Evento de click do botao voltar 
        /// </summary>
        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            //Redireciona para a pagina anterior
            Response.Redirect("~/Apresentacao/Produtos/ListarProdutos.aspx");


        }

        /// <summary>
        /// Evento de click do checkbox de email
        /// </summary>
        protected void ckbPermitirEmail_CheckedChanged(object sender, EventArgs e)
        {
            //Se tiver checado, fornece as outras funcionalidades ao usuario
            if (ckbPermitirEmail.Checked == true)
            {
                txtPedido.Enabled = true;
                lblValidacaoPedido.Visible = true;
                

            }
            else
            {
                txtPedido.Enabled = false;
                lblValidacaoPedido.Visible = false;
            }
        }

        /// <summary>
        /// Evento de troca de fornecedor do dropdownlist 
        /// </summary>
        protected void ddlFornecedores_SelectedIndexChanged(object sender, EventArgs e)
        {
            Fornecedor fornecedor = servico_fornecedor.ListarFornecedoresCache().Where(i => i.ID == Convert.ToInt32(ddlFornecedores.SelectedValue)).FirstOrDefault();

            //Preenche os text box correspondentes
            txtTelefone.Text = fornecedor.TelefoneFornecedor;
            txtEmailFornecedor.Text = fornecedor.EmailFornecedor;

        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            Page.ClientScript.RegisterStartupScript(

                     this.GetType(),

                     "error",

                     "$(window).load(function(){alert('" + msg + "')});",

                     true);

        }
    }
}